package main

import (
	"errors"
	"fmt"
	"runtime"
)

func div(a, b int) (int, error) {
	// defer func() {
	// 	err := recover()
	// 	fmt.Printf("%T %[1]v\n", err)
	// 	if v, ok := err.(error); ok {
	// 		// fmt.Println(v.Error())
	// 		fmt.Println(v)
	// 	} else {
	// 		fmt.Println("管不了")
	// 	}
	// }()
	defer fmt.Println("1 进入div")
	defer fmt.Println(2, a, b)
	defer func() {
		err := recover()
		fmt.Printf("8: %T %[1]v\n", err)
		switch v := err.(type) {
		case nil:
			fmt.Println("沒有错误", v)
		//case *errors.errorString:
		case error:
			fmt.Println("我是error接口类型的", v.Error())
			panic(v) // 继续外抛
		case runtime.Error:
			fmt.Printf("运行时错误, %T %[1]v\n", v)
		case int:
			fmt.Println("我是int类型", v)
		case string:
			fmt.Println("我是string类型", v)
		default:
			fmt.Println("其它错误类型，我管不了")
		}
	}()
	r := a / b
	panic(errors.New("自定义异常原因字符"))
	//panic(123)
	//panic("abc")
	fmt.Println(3, "a/b")
	return r, nil
}

type MyInt int

func main() {
	defer func() {
		err := recover()
		fmt.Printf("6 在main中管panic, %v\n", err)
	}()
	if r, err := div(5, 2); err != nil {
		fmt.Println("4 有错误", err)
	} else {
		fmt.Println("5 没有错误", r)
	}
	fmt.Println("7 进程正常结束")
}
